package com.wxf.publishSubscribe;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 简单模式消费者消费消息的第二种写法
 */

public class Consumer02 {

    public static void main(String[] args) {
        // 1-创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.127.131");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("123456");
        connectionFactory.setVirtualHost("/");
        // 2-创建连接
        Connection conn = null;
        Channel channel = null;
        try {
            conn = connectionFactory.newConnection("消费者02");

            // 3-创建通道
            channel = conn.createChannel();

           /* channel.queueDeclare(Producer.FANOUT_QUEUE_2,true,false,false,null);*/
            // 4-消费消息
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
                // 参数列表
                // 参数1：consumerTag，消息者标签
                // 参数2：envelope，消息包的内容，可以从中获取消息id，路由key，消息，重传标志，交换机
                // 参数3：properties 属性信息
                // 参数4：body，消息内容
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("路由key为：" + envelope.getRoutingKey());
                    System.out.println("交换机为：" + envelope.getExchange());
                    System.out.println("消息id为：" + envelope.getDeliveryTag());
                    System.out.println("接收到的消息为：" + new String(body, "utf-8"));
                }
            };

            // 参数1：队列名称
            // 参数2：是否自动确认，设置为true为表示消息接收到自动向mq回复接收到了，mq接收到回复会删除消息，设置为false则需要手动确认
            // 参数3：consumerTag 消息者标签
            // 参数4：是否独占连接
            // 参数5：
            // 参数6：携带附属参数
            // 参数7：Consumer
            channel.basicConsume(Producer.FANOUT_QUEUE_2,true,"",false,false,null,defaultConsumer);
            // 阻断程序，用于观察过程
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }finally {
            //7-关闭通道
            if(channel!=null&&channel.isOpen()){
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
            // 8-关闭连接
            if(conn!=null&&conn.isOpen()){
                try {
                    conn.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
